#include <head.h>

/*
管道
pipe
`pipefd[0]` 是管道的读端
`pipefd[1]` 是管道的写端
*/
int main(int argc, char const *argv[])
{
    // 创建管道
    int p_fd[2]; // 一个管道只能单端通讯  如果想双端通讯 则可以建立两个管道
    if (-1 == pipe(p_fd))
    {
        perror("pipe error:");
        return -1;
    }

    // 创建进程
    pid_t pid = 0;

    if (-1 == (pid = fork()))
    {
        perror("fork error:");
        close(p_fd[0]); // 关闭 读端
        close(p_fd[1]); // 关闭 写端
        return -1;
    }
    else if (0 < pid) // 父进程
    {
        // 关闭 读端
        close(p_fd[0]);
        char buf_write[128];
        while (1)
        {
            // 写入数据
            printf("父进程 请输入你需要传输的数据:\n");
            scanf("%s", buf_write);
            if (!strcmp(buf_write, "quit"))
            {
                write(p_fd[1], buf_write, strlen(buf_write));
                printf("父进程 退出\n");
                break;
            }

            write(p_fd[1], buf_write, strlen(buf_write));
            usleep(50000);
            // 1 1000   1 1000
        }

        // 关闭写端
        close(p_fd[1]);
    }
    else if (0 == pid) // 子进程
    {
        // 关闭 写端
        close(p_fd[1]);
        char buf_read[128];
        while (1)
        {
            // 读取数据
            memset(buf_read, 0, sizeof(buf_read));
            read(p_fd[0], buf_read, sizeof(buf_read));
            if (strlen(buf_read) == 0)
            {
                continue;
            }
            
            if (!strcmp(buf_read, "quit"))
            {
                printf("子进程 退出\n");
                break;
            }
            printf("子进程 读取的数据是: %s\n", buf_read);
        }
        // 关闭读端
        close(p_fd[0]);
    }

    return 0;
}
